#include <iostream>
#include <unistd.h>
#include <cerrno>
#include <cassert>
#include <cstring>
#include <cstdlib>
using namespace std;

int main()
{
    int pipefd[2] = {0};
    // 1.创建管道
    int n = pipe(pipefd);
    if(n < 0) 
    {
        cout << "pipe errno, " << errno << strerror(errno) << endl;
        return 1;
    }
    // 2.创建子进程
    pid_t id = fork(); // 意料之外用if，意料之中用assert
    if(id < 0) 
    {
        cout << "pipe fork, " << errno << strerror(errno) << endl;
        return 1;
    }
    // 3.关闭不需要的fd
    if(id == 0)
    {
        // 子进程
        close(pipefd[0]); // 关闭读功能
        // 4.传输数据
        const char* buff = "hello pipe";
        write(pipefd[1], buff, strlen(buff));
        exit(0);
    }
    // 父进程
    close(pipefd[1]); // 关闭写功能
    // 4.传输数据
    char buff[1024];
    read(pipefd[0], buff, sizeof(buff) - 1);
    cout << buff << endl;

    return 0;
}